package com.yaxin.outsourcing.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yaxin.common.core.domain.PageQuery;
import com.yaxin.common.core.page.TableDataInfo;
import com.yaxin.outsourcing.domain.dto.OutsourcingPersonDTO;
import com.yaxin.outsourcing.domain.po.OutsourcingPerson;


import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.util.List;

/**
 * <p>
 * 外协人员信息表 服务类
 * </p>
 *
 * @author zcc
 * @since 2025-07-29
 */
public interface IOutsourcingPersonService extends IService<OutsourcingPerson> {

    /**
     * 查询人员列表
     * @param outsourcingPerson
     * @param pageQuery
     * @return
     */
    TableDataInfo<OutsourcingPerson> queryPersonList(OutsourcingPerson outsourcingPerson, PageQuery pageQuery);

    /**
     * 添加人员信息
     * @param dto
     * @return
     */
    Long addOutsourcingPerson(@Valid OutsourcingPersonDTO dto);

    /**
     * 修改人员信息
     * @param id
     * @param person
     * @return
     */
    boolean updateOutPerson(Long id, OutsourcingPerson person);

    /**
     * 根据ID查询人员详情
     * @param id
     * @return
     */
    OutsourcingPerson getPersonDetailById(Long id);

    /**
     * 删除人员
     * @param ids
     * @return
     */
    Boolean deletePerson(List<Long> ids);

    /**
     * 检察人员是否失效
     * @return
     */
    Void statusCheck();

    /**
     * 检查申请单人员数量是否超限
     * @param appId 申请单ID
     * @throws RuntimeException 当超过人数限制时抛出异常
     */
    void checkPersonCountLimit(Long appId);

    /**
     * 根据身份证号查询人员信息
     * @param idCard 身份证号
     * @return 人员信息
     */
    OutsourcingPerson selectByIdCard(@NotBlank(message = "身份证号不能为空") @Pattern(regexp = "^\\d{17}[\\dXx]$", message = "身份证号格式不正确") String idCard);

    /**
     * 为人员设置IC卡编号
     * @param person 人员信息
     */
    void setIcNoForPerson(OutsourcingPerson person);

    /**
     * 为申请单设置IC卡编号
     * @param appId 申请单ID
     */
    void setIcNoForAppId(Long appId);

    /**
     * 打印人员临时工作证
     * @param ids 人员ID列表
     */
    void printPersonWorkCard(List<Long> ids);
}
